package com.concurrent;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @Classname ScheduledThreadPoolDemo
 * @Description
 *
 * ScheduledExecutorService#scheduleAtFixedRate() 指的是“以固定的频率”执行，period（周期）指的是两次成功执行之间的时间
 *  比如，scheduleAtFixedRate(command, 5, 2, second)，第一次开始执行是5s后，假如执行耗时1s，那么下次开始执行是7s后，再下次开始执行是9s后
 *
 * 而ScheduledExecutorService#scheduleWithFixedDelay() 指的是“以固定的延时”执行，delay（延时）指的是一次执行终止和下一次执行开始之间的延迟
 *  还是上例，scheduleWithFixedDelay(command, 5, 2, second)，第一次开始执行是5s后，假如执行耗时1s，执行完成时间是6s后，那么下次开始执行是8s后，再下次开始执行是11s后
 *
 *
 * @Date 2020/9/20 17:37
 * @Created by xiangty
 */
public class ScheduledThreadPoolDemo {

    public static void main(String[] args) {


        ScheduledExecutorService scheduledThreadPoolExecutor = Executors.newScheduledThreadPool(3);
        System.out.println(" xxxxx---> " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

        // 第一次等initialDelay = 3秒 (初始延迟)进入线程，然后没 period=5秒 (周期)执行一次
//        scheduledThreadPoolExecutor.scheduleAtFixedRate(()->{
//            System.out.println(" xxxx开始--> " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//            try {
//                TimeUnit.SECONDS.sleep(2);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            System.out.println(" xxxx结束--> " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//        }, 3, 5, TimeUnit.SECONDS);


        scheduledThreadPoolExecutor.scheduleWithFixedDelay(()->{
            System.out.println(" xxxxx 开始 ---> " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(" xxxxx 结束 ---> " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
        }, 3,5, TimeUnit.SECONDS);



    }


}
